package com.example.lt.controller;

import com.baomidou.mybatisplus.extension.api.R;
import com.example.lt.constant.MessageConstants;
import com.example.lt.context.BaseContext;
import com.example.lt.entity.queryPage.BasePage;
import com.example.lt.entity.video.Video;
import com.example.lt.limit.Limit;
import com.example.lt.service.video.VideoService;
import com.example.lt.util.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author 小涛Tao
 * @Date: 2024/07/29/21:06
 * version 1.0 注释：视频控制层，有 【初始化收件箱】 等接口
 **/
@Slf4j
@RestController // @RestController 是 @Controller 和 @ResponseBody 注解的组合
@RequiredArgsConstructor
@RequestMapping("/joyfulMoments/video")
public class VideoController {

    private final VideoService videoService;


    /**
     * 发布视频 / 修改视频
     * @param video
     * @return
     */
    @PostMapping
    @Limit(limit = 5, time = 3600L, msg = "发布视频一小时内不可超过5次")
    public Result publishVideo(@RequestBody @Validated Video video) {
        log.info("发布或修改视频");
        videoService.publishVideo(video);
        return Result.ok().message(MessageConstants.PUBLISH_SUCCESS);
    }

    /**
     * 删除视频
     * @param id 视频id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result deleteVideo(@PathVariable Long id) {
        log.info("删除视频：{}", id);
        videoService.deleteVideo(id);
        return Result.ok().message(MessageConstants.DELETE_SUCCESS);
    }

    /**
     * 推送关注人的视频
     * @param lastTime 前端视频集合中最后一个视频的创建时间，滚动分页
     * @return
     */
    @GetMapping("/follow/feed")
    public Result followFeed(@RequestParam(required = false) Long lastTime) {
        final Long userId = BaseContext.get();
        log.info("推送关注人的视频，从系统 in:follow:feed:{} 中获取视频id", userId);
        return Result.ok().data(videoService.followFeed(userId, lastTime));
    }

    /**
     * 查看用户所管理的视频 -稿件管理
     * @param basePage
     * @return
     */
    @GetMapping
    public Result listVideo(BasePage basePage) {
        final Long userId = BaseContext.get();
        log.info("稿件管理：分页查询用户:{}的视频", userId);
        return Result.ok().data(videoService.listByUserIdVideo(basePage, userId));
    }


    /**
     * 用户一登陆就根据关注的人来初始化【用户收件箱】，以及删除7天前的历史浏览记录
     * @return
     */
    @PostMapping("/init/follow/feed")
    public Result initFollowFeed() {
        log.info("初始化收件箱，并删除7天前的浏览记录");
        final Long userId = BaseContext.get();
        videoService.initFollowFeed(userId); // 初始化收件箱
        videoService.deleteHistory(userId); // 删除记录
        return Result.ok();
    }

    /**
     * 获取审核队列状态
     * @return
     */
    @GetMapping("/audit/queue/state")
    public Result getAuditQueueState() {
        log.info("获取审核队列状态");
        return Result.ok().message(videoService.getAuditQueueState());
    }


    /**
     * 用户 收藏/取消收藏 视频
     * @param favoritesId 收藏夹id
     * @param videoId 视频id
     * @return
     */
    @PostMapping("/favorites/{favoritesId}/{videoId}")
    public Result favoritesVideo(@PathVariable Long favoritesId, @PathVariable Long videoId) {
        log.info("用户 收藏/取消收藏 视频：{}", videoId);
        final String msg = videoService.favoritesVideo(favoritesId, videoId) ? "已收藏" : "取消收藏";
        return Result.ok().message(msg);
    }

    /**
     * 获取指定收藏夹下的视频
     * @param favoriteId 收藏夹id
     * @return
     */
    @GetMapping("/favorites/{favoriteId}")
    public Result listVideosByFavorites(@PathVariable Long favoriteId) {
        log.info("获取收藏夹{}下的视频", favoriteId);
        return Result.ok().data(videoService.listVideoByFavorites(favoriteId));
    }

    /**
     * 点赞视频
     * @param videoId 视频id
     * @return
     */
    @PostMapping("/star/{videoId}")
    public Result starVideo(@PathVariable Long videoId) {
        log.info("用户点赞视频：{}", videoId);
       String msg = "已点赞";
       if (!videoService.starVideo(videoId)) {
           msg = "已取消点赞";
       }
       return Result.ok().message(msg);
    }

    /**
     * 添加视频浏览记录到redis中
     * @param videoId 视频id
     * @return
     */
    @PostMapping("/history/{videoId}")
    public Result addHistory(@PathVariable Long videoId) {
        final Long userId = BaseContext.get();
        log.info("用户：{}添加视频浏览记录：{}", userId, videoId);
        videoService.historyVideo(videoId, userId);
        return Result.ok();
    }

    /**
     * 用户获取历史浏览记录
     * @return
     */
    @GetMapping("/history")
    public Result getHistory(BasePage basePage) {
        final Long userId = BaseContext.get();
        log.info("用户：{}获取历史浏览记录", userId);
        return Result.ok().data(videoService.getHistory(userId, basePage));
        // TODO 这里的 BasePage 是空的，前端没有传值过来
    }

}
